import utils.FileUtils;
import utils.SystemLookup;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;

public class Genarator {
    private static boolean isDebug = true;

    public static void main(String[] args) {

        if (args.length < 4 || args.length > 5) {
            System.out.println("Nieprawidlowa liczba parametrów");
            System.out.println("Nalezy ustawic od 4 do 5 parametrów:");
            System.out.println("Np.: a b n fileName | s");
            System.out.println("a b n - integer");
            System.out.println("fileName - nazwa pliku wyjściowego");
            System.out.println("s - parametr sortowania");
            System.out.println("ss - parametr sortowania bez powtórzeń");
            System.exit(1);
        }

        int a = 0, b = 0, n = 0;
        String fileName = null;

        try {
            a = Integer.parseInt(args[0]);
            b = Integer.parseInt(args[1]);
            n = Integer.parseInt(args[2]);
            fileName = args[3];
        } catch (Exception ex) {
            System.out.println("Bład parsowania parametru na liczbe");
            System.exit(1);
        }

        if(args.length == 5 && "ss".equals(args[4])) {
            if((b-a) > n) {
                noRepeatGenerator(a, b, n, fileName);
                System.exit(1);
            } else {
                System.out.println("Za maly zakres aby wygenerowac liczby bez powtorzen");
                System.exit(1);
            }
        }

        if(args.length == 5 && "s".equals(args[4])) {
            generaror(a, b, n, fileName, true);
        } else {
            generaror(a, b, n, fileName, false);
        }

    }

    private static void noRepeatGenerator(int a, int b, int n, String fileName) {
        Random rand = new Random();
        Set<Integer> set = new HashSet<>();
        while(set.size() < n) {
            set.add(rand.nextInt(b - a + 1) + a);
        }

        Integer[] tab = new Integer[set.size()];
        set.toArray(tab);
        Arrays.sort(tab);
        //System.out.println(Arrays.toString(tab));
        int[] tabi = new int[tab.length];
        //convert Integer[] to int[]
        for(int ctr = 0; ctr < tab.length; ctr++) {
            tabi[ctr] = tab[ctr];
        }
        FileUtils.saveArrayToFile(tabi, SystemLookup.PATH_TO_SAVE, fileName);
        System.out.println(SystemLookup.PATH_TO_SAVE + fileName + FileUtils.FILE_EXTENSION);

    }

    static void generaror(int a, int b, int n, String fileName, boolean isSort) {
        int[] tab = generaror(a, b, n);
        if (isSort) {
            Arrays.sort(tab);
        }
        if (isDebug)
        System.out.println(Arrays.toString(tab));
        FileUtils.saveArrayToFile(tab, SystemLookup.PATH_TO_SAVE, fileName);
        System.out.println(SystemLookup.PATH_TO_SAVE + fileName + FileUtils.FILE_EXTENSION);
    }

    static int[] generaror(int a, int b, int n) {
        Random rand = new Random();
        int[] tab = new int[n];
        for (int i = 0; i < n; i++) {
            tab[i] = rand.nextInt(b - a + 1) + a;
        }
        return tab;
    }

}
